package doing.normal_001_100;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

/**
 * 8. String to Integer (atoi) 字符串转换整数 (atoi)
 * <p>
 * Example 1:
 * Input: "42"
 * Output: 42
 * Example 2:
 * Input: "  -42"
 * Output: -42
 * <p>
 * 字符串转为整数是很常用的一个函数，由于输入的是字符串，所以需要考虑的情况有很多种。
 * 我之前有一篇文章是关于验证一个字符串是否为数字的，参见 Valid Number。在那篇文
 * 章中，详细的讨论了各种情况，包括符号，自然数，小数点的出现位置，判断他们是否是数字
 * 。个人以为这道题也应该有这么多种情况。但是这题只需要考虑数字和符号的情况：
 * <p>
 * 1. 若字符串开头是空格，则跳过所有空格，到第一个非空格字符，如果没有，则返回0.
 * 2. 若第一个非空格字符是符号+/-，则标记sign的真假，这道题还有个局限性，那就是在c++
 * 里面，+-1和-+1都是认可的，都是-1，而在此题里，则会返回0.
 * 3. 若下一个字符不是数字，则返回0. 完全不考虑小数点和自然数的情况，不过这样也好，
 * 起码省事了不少。
 * 4. 如果下一个字符是数字，则转为整形存下来，若接下来再有非数字出现，则返回目前的结果。
 * 5. 还需要考虑边界问题，如果超过了整形数的范围，则用边界值替代当前值。
 * <p>
 * 2019-03-17 5:45 PM
 **/
@Slf4j
public class StringToInteger {

    @SuppressWarnings("all")
    public int myAtoi(String str) {
        //TODO
        return -1;
    }

    @Test
    public void test() {
        log.info("result: {}",
                myAtoi(" -42"));
    }
}































/*
public int myAtoi(String str) {

    if (str==null || str.length()==0) {
        return 0;
    }

    int sign = 1, base = 0, i = 0, n = str.length();
    while (i < n && str.charAt(i) == ' ') {
        ++i;
    }

    if (i < n && (str.charAt(i) == '+' || str.charAt(i) == '-')) {
        sign = (str.charAt(i++) == '+') ? 1 : -1;
    }

    while (i < n && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
        if (base > MAX_VALUE / 10 || (base == MAX_VALUE / 10 && str.charAt(i) - '0' > 7)) {
            return (sign == 1) ? MAX_VALUE : MIN_VALUE;
        }
        base = 10 * base + (str.charAt(i++) - '0');
    }

    return base * sign;
}
*/
